//
//  Query.swift
//  SLDatabase
//
//  Created by 姚胜龙 on 2017/7/6.
//  Copyright © 2017年 姚胜龙. All rights reserved.
//

import UIKit

/**
 * 操作类型
 * 定义抽象->操作类型接口->(表操作：查询表、删除表、创建表 ...)
 * 
 */

public struct QueryManager {
    //创建表操作->使用(元组)定义
    var from:(name:String, database:String?)

    //构造方法，外部不能访问
    fileprivate init(_ name:String, _ database:String? = nil) {
        self.from = (name, database)
    }
}

public protocol QueryType: Expressible {

    //查询类型 ->（创建、查询、插入、更新、删除、排序...）
    //为了管理方便管理这些操作，封装成一个管理器
    var queryManager:QueryManager { get set }

    //提供一个构造方法
    init(_ name:String, _ database:String?)
}

//扩展表类型，提供默认的实现
extension QueryType {

    public var expression: Expression<Void> {
        let expresion = [Expressible?]()
        //组装 例如：一个表有多个字段 name sex 组装成 => name, sex
        return ", ".join(expresion.flatMap({ $0 })).expression
    }

    //包装数据库的表名
    func tableName() -> Expressible {
        return " ".join([database(namespace: queryManager.from.name)])
    }

    //使用 数据库名.表名 形式
    func database(namespace name:String) -> Expressible {
        let name = Expression<Void>(name)

        guard let database = queryManager.from.database else {
            return name
        }
        return ".".join([Expression<Void>(database), name])
    }

}

//----------------------------------
//实现操作类型->定义表->Table类
//表操作类型
public protocol SchemaType: QueryType {
    //定义一个非常重要的属性 -> 数据库关键字 表关键字
    //例如："TABLE" "虚函数"
    static var identifier:String { get }
}

public struct Table: SchemaType {

    public var queryManager: QueryManager
    //表关键字 （唯一标示） 以后还有很多例如："SELECT" "DROP"...
    public static var identifier: String = "TABLE"

    //这里传一个数据库，主要是在创建表、查询表的时候会用到 
    //例如：create table test.t_user
    //数据库的语法 [数据库名称].[表名]
    public init(_ name:String, _ database:String? = nil) {
        self.queryManager = QueryManager(name, database)
    }
}



